#include "../logs/zdflog.h"  // 引入自定义日志库头文件

/**
 * @brief 日志器功能测试函数
 * @param logger_name 要测试的日志器名称
 * 该函数通过指定名称获取日志器实例，并进行各类日志输出测试
 */
void loggerTest(const std::string &logger_name)
{
    // 根据名称获取日志器实例（智能指针）
    zdflog::Logger::ptr lp = zdflog::getLogger(logger_name);
    assert(lp.get());  // 断言确保日志器实例获取成功

    // 输出测试分隔线
    LOGF("------------example--------------------");

    // 测试日志器直接调用成员函数输出日志
    lp->debug("%s", "logger->debug");   // DEBUG级别日志
    lp->info("%s", "logger->info");     // INFO级别日志
    lp->warn("%s", "logger->warn");     // WARN级别日志
    lp->error("%s", "logger->error");   // ERROR级别日志
    lp->fatal("%s", "logger->fatal");   // FATAL级别日志

    // 测试宏定义方式输出日志（通常宏会自动添加文件名和行号信息）
    LOG_DEBUG(lp, "%s", "LOG_DEBUG");   // DEBUG级别日志（宏方式）
    LOG_INFO(lp, "%s", "LOG_INFO");     // INFO级别日志（宏方式）
    LOG_WARN(lp, "%s", "LOG_WARN");     // WARN级别日志（宏方式）
    LOG_ERROR(lp, "%s", "LOG_ERROR");   // ERROR级别日志（宏方式）
    LOG_FATAL(lp, "%s", "LOG_FATAL");   // FATAL级别日志（宏方式）

    // 输出测试结束分隔线
    LOGF("---------------------------------------");

    // 压力测试：连续输出大量日志，测试日志器性能和稳定性
    std::string log_msg = "hello zdfejiuyeke-";  // 日志消息前缀
    size_t count = 0;
    // 循环输出100万条日志
    while (count < 1000000)
    {
        // 构建带序号的日志消息
        std::string msg = log_msg + std::to_string(count++);
        // 输出ERROR级别日志（选择ERROR级别便于测试，可根据需要修改）
        lp->error("%s", msg.c_str());
    }
}

/**
 * @brief 日志功能测试入口
 * 该函数创建全局日志器并配置其属性（输出目标、格式、类型等），然后调用测试函数
 */
void functional_test()
{
    // 创建全局日志器构建器（智能指针）
    zdflog::GlobalLoggerBuilder::ptr lbp(new zdflog::GlobalLoggerBuilder);

    // 配置日志器名称
    lbp->buildLoggerName("all_sink_logger");
    // 配置日志格式：[时间][日志器名称][文件名:行号][级别] 消息内容+换行
    lbp->buildFormatter("[%d][%c][%f:%l][%p] %m%n");
    // 配置日志输出级别阈值：DEBUG（输出所有级别日志）
    lbp->buildLoggerLevel(zdflog::LogLevel::value::DEBUG);
    // 添加日志输出目标（Sink）：标准输出（控制台）
    lbp->buildSink<zdflog::StdoutSink>();
    // 添加日志输出目标：文件（./logs/sync.log）
    lbp->buildSink<zdflog::FileSink>("./logs/sync.log");
    // 添加日志输出目标：滚动文件（路径前缀./logs/roll-，单个文件最大10MB）
    lbp->buildSink<zdflog::RollSink>("./logs/roll-", 10 * 1024 * 1024);
    // 配置日志器类型：异步日志器（日志输出由后台线程处理）
    lbp->buildLoggerType(zdflog::Logger::Type::LOGGER_ASYNC);
    // 构建日志器并注册到全局管理器
    lbp->build();

    // 调用测试函数，测试名为"all_sink_logger"的日志器
    loggerTest("all_sink_logger");
}

/**
 * @brief 程序主入口
 * @param argc 命令行参数数量
 * @param argv 命令行参数数组
 * @return 程序退出码（0表示成功）
 */
int main(int argc, char *argv[])
{
    // 执行日志功能测试
    functional_test();
    return 0;
}